/***************************************************************************
 * MSDAIPP2.H
 *
 *  Header File for the Microsoft Data Access Internet Publishing Provider
 *   (MSDAIPP) Version 2.0 for OLEDB 2.5 clients.
 *
 *  Copyright (c)1999-2003; Microsoft Corporation, All rights reserved.
 *  Provided by DSOI Office Integration, Microsoft Developer Support
 *
 *  THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
 *  EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
 *  WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
 *
 ***************************************************************************/
#ifndef __MSDAIPP_V2_H
#define __MSDAIPP_V2_H

///////////////////////////////////////////////////////////////////////////////////
// Internet Publishing Provider (MSDAIPP)
//
// Currently there are three versions of the provider: 
//
//  1.0 -- Released with Office 2000, running on MDAC 2.1.
//  1.5 -- Released with Office 2000 SR1 (and Windows 2000), running on MDAC 2.5.
//  2.0 -- Released with Office XP and SharePoint Portal Server, running on MDAC 2.6.
//
// Version 1.5 comes standard with all current Windows platforms, and is the most
// common provider in use. Version 2.0 offers better offline, caching and performance
// features, along with support for SPS workspaces and Exchange/SQL DAV servers.
//
// This header file is NOT OFFICIAL. We are using it add defines new to version 2.0,
// which are not in the official 1.5 realease as part of MDAC 2.5. The sample will 
// remain compatible with all versions of the provider, but we will enable features
// new to 2.0 if available.
//
// Although MSDAIPP is officially an OLEDB 2.5 provider, it can run on machines with 
// MDAC 2.1 installed. However, attempting to run it on machines with an earlier version
// of MDAC will result in the error IPP_E_MDAC_VERSION (as defined below).
//
#define OLEDBVER 0x0250  // OLEDB 2.5 Compatible

#include <oledb.h>
#include <oledberr.h>

///////////////////////////////////////////////////////////////////////////////////
// Is IBindResource defined? If not, you have an old copy of OLEDB.H that shipped
// with Visual Studio 6.0 before the final MDAC 2.5 release. You need to have the
// correct header and lib to re-build this sample. Both the updated header and lib
// file ship with the MDAC 2.5 SDK, Windows 2000 Platform SDK, and/or the
// Visual Studio 6.0 SP5 setup.
//
// You can call Microsoft Product Support to obtaian these files if you cannot 
// install and one of the products above. See http://support.microsoft.com for
// more information about Contacting Microsoft.
//
#ifndef __IBindResource_FWD_DEFINED__
#error You have an outdated copy of OLEDB.H, please update your Platform SDK.
#endif

#ifdef __cplusplus
extern "C" {
#endif

///////////////////////////////////////////////////////////////////////////////////
// MSDAIPP Provider CLSIDs
//
//  CLSID_MSDAIPP_DSO     -- "{AF320921-9381-11D1-9C3C-0000F875AC61}"
//  CLSID_MSDAIPP_BINDER  -- "{E1D2BF40-A96B-11D1-9C6B-0000F875AC61}"
//
#ifdef DBINITCONSTANTS
	extern const CLSID CLSID_MSDAIPP_DSO        = {0xAF320921, 0x9381, 0x11d1, {0x9C, 0x3C, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x61}};
	extern const CLSID CLSID_MSDAIPP_BINDER     = {0xE1D2BF40, 0xA96B, 0x11d1, {0x9C, 0x6B, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x61}};
#else
	extern const CLSID CLSID_MSDAIPP_DSO;
	extern const CLSID CLSID_MSDAIPP_BINDER;
#endif

///////////////////////////////////////////////////////////////////////////////////
// MSDAIPP Protocol GUIDSs (not in OLEDB.H)
//
//  GUID_DAV_PROVIDER    -- "{9FECD570-B9D4-11D1-9C78-0000F875AC61}"
//  GUID_WEC_PROVIDER    -- "{9FECD571-B9D4-11D1-9C78-0000F875AC61}"
//  GUID_HTTP_PROVIDER   -- "{9FECD572-B9D4-11D1-9C78-0000F875AC61}"
//
#ifdef DBINITCONSTANTS
	extern const GUID GUID_DAV_PROVIDER         = {0x9FECD570, 0xB9D4, 0x11d1, {0x9C, 0x78, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x61}};
	extern const GUID GUID_WEC_PROVIDER         = {0x9FECD571, 0xB9D4, 0x11d1, {0x9C, 0x78, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x61}};
	extern const GUID GUID_HTTP_PROVIDER        = {0x9FECD572, 0xB9D4, 0x11d1, {0x9C, 0x78, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x61}};
#else
	extern const GUID GUID_DAV_PROVIDER;
	extern const GUID GUID_WEC_PROVIDER;
	extern const GUID GUID_HTTP_PROVIDER;
#endif


///////////////////////////////////////////////////////////////////////////////////
// MSDAIPP Specific Error Codes (not defined in OLEDBERR.H)
//
#define IPP_E_SYNCCONFLICT               0xC0048003L  //  The server resource has changed since the local copy on your computer was obtained.
#define IPP_E_FILENOTDIRTY               0xC0048004L  //  The copy of the resource on your computer has not been modified since it was downloaded from the server.
#define IPP_E_MARKFOROFFLINE_FAILED      0xC0048006L  //  The attempt to mark or unmark the resource for offline use failed.
#define IPP_E_OFFLINE                    0xC0048007L  //  The requested operation could not be completed because the resource is offline.
#define IPP_E_UNSYNCHRONIZED             0xC0048008L  //  The requested operation could not be completed because the resource has been modified on your computer but has not been synchronized with the server.
#define IPP_E_SERVERTYPE_NOT_SUPPORTED   0xC004800AL  //  This server type is not currently supported.
#define IPP_E_MDAC_VERSION               0xC004800DL  //  The Microsoft Data Access Components (MDAC) are either not present on this computer or are an old version. (MSDAIPP 1.0 requires MDAC 2.1)
#define IPP_E_COLLECTIONEXISTS           0xC004800EL  //  The move or copy operation failed because a collection with that name already exists.
#define IPP_E_CANNOTCREATEOFFLINE        0xC004800FL  //  The requested resource could not be created because parent cache entry does not exist.
#define IPP_E_STATUS_CANNOTCOMPLETE      0xC0048101L  //  This is an internal MSDAIPP.DLL error.
#define IPP_E_RESELECTPROVIDER           0xC0048102L  //  This is an internal MSDAIPP.DLL error.
#define IPP_E_CLIENTMUSTEMULATE          0xC0048103L  //  This is an internal MSDAIPP.DLL error.
#define IPP_S_WEAKRESERVE                0x00048104L  //  This is an internal MSDAIPP.DLL error.
#define IPP_S_TRUNCATED                  0x00048105L  //  This is an internal MSDAIPP.DLL error.
#define IPP_S_REDIRECTEDORMOVED          0x00048106L  //  The server redirected MSDAIPP to a url different from the one being bound to because the object was moved. The new url is the one that MSDAIPP has bound to.
#define IPP_S_DRAFTREDIRECTED            0x00048107L  //  A versioning aware server redirected MSDAIPP from the url requested by the client to a version specific url.
#define IPP_E_REDIRECTEDORMOVED          0xC0048108L  //  The server redirected MSDAIPP to a url different from the one being bound to because the object was moved. However, MSDAIPP can't handle this redirection.


///////////////////////////////////////////////////////////////////////////////////
// MSDAIPP Initialization
//
#define MSDAIPP_VERSION_1 L"PKM"
#define MSDAIPP_VERSION_2 L"2.0"

#define DBPROP_INIT_IGNORECACHEDDATA        2L      // VT_BOOL
#define DBPROP_INIT_CACHEAGGRESSIVELY       3L      // VT_BOOL
#define DBPROP_INIT_TREATASOFFLINE          4L      // VT_BOOL
#define DBPROP_INIT_MARKFOROFFLINE          5L      // VT_I4
#define DBPROP_INIT_PROTOCOLPROVIDER        6L      // VT_CLSID
#define DBPROP_INIT_FLUSHWININETPWCACHE	    7L      // VT_BOOL
#define DBPROP_INIT_USERAGENT               8L      // VT_BSTR
#define DBPROP_INIT_CUSTOMHTTPHEADERS       9L      // VT_BSTR
#define DBPROP_INIT_USELOCKDISCOVERY       10L      // VT_BOOL
#define DBPROP_INIT_WEC_SHOWTHICKETFILES   14L      // VT_BOOL
#define DBPROP_INIT_URLENCODING            69L      // VT_I4
  
#define DBPROP_SESS_SERVERTYPE              2L      // VT_I4
#define DBPROP_SESS_SERVERVERSION           3L      // VT_BSTR

#define SERVERTYPE_OWS				1
#define SERVERTYPE_PLATINUM			2
#define SERVERTYPE_TAHOE			3
#define SERVERTYPE_OTHERWEC			4
#define SERVERTYPE_OTHERDAV			5

#define DBPROPVAL_UE_URL_UNICODE			0x00000001L
#define DBPROPVAL_UE_URL_MBS				0x00000002L
#define DBPROPVAL_UE_URL_UTF8				0x00000004L
#define DBPROPVAL_UE_URL_CANONICALIZED		0x00000008L
#define DBPROPVAL_UE_URL_PASSTHROUGH		0x00000010L

enum MFO
{
	MFO_DONTCHANGE  = 0,  
	MFO_MARK        = 1,
	MFO_UNMARK      = 2
};

#ifdef DBINITCONSTANTS
	extern const GUID DBPROPSET_MSDAIPP_INIT    = {0x8F1033E3, 0xB2CD, 0x11d1, {0x9C, 0x74, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x61}};
	extern const GUID DBPROPSET_MSDAIPP_SESSION = {0xD9873792, 0xBD62, 0x41a7,{0x9B, 0x0D, 0x81, 0x51, 0x07, 0x03, 0x67, 0xAC}};
	extern const GUID DBPROPSET_MSDAIPP_COMMAND = {0xD395C253, 0x6511, 0x11d1, {0x9C, 0x09, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x61}};
#else
	extern const GUID DBPROPSET_MSDAIPP_INIT;
	extern const GUID DBPROPSET_MSDAIPP_SESSION;
	extern const GUID DBPROPSET_MSDAIPP_COMMAND;
#endif

///////////////////////////////////////////////////////////////////////////////////
// Definition of MSDAIPP resource rowset columns
//
#define MSDAIPP_MAX_URL_LENGTH 4096

#define RESOURCE_PARSENAME                      L"RESOURCE_PARSENAME"
#define RESOURCE_PARSENAME_ALTNAME              L"DAV:name"
#define RESOURCE_PARSENAME_DBTYPE               DBTYPE_WSTR
#define RESOURCE_PARSENAME_MAXLENGTH            MSDAIPP_MAX_URL_LENGTH

#define RESOURCE_PARENTNAME                     L"RESOURCE_PARENTNAME"
#define RESOURCE_PARENTNAME_ALTNAME             L"DAV:parentname"
#define RESOURCE_PARENTNAME_DBTYPE              DBTYPE_WSTR
#define RESOURCE_PARENTNAME_MAXLENGTH           MSDAIPP_MAX_URL_LENGTH

#define RESOURCE_ABSOLUTEPARSENAME              L"RESOURCE_ABSOLUTEPARSENAME"
#define RESOURCE_ABSOLUTEPARSENAME_ALTNAME      L"DAV:href"
#define RESOURCE_ABSOLUTEPARSENAME_DBTYPE       DBTYPE_WSTR
#define RESOURCE_ABSOLUTEPARSENAME_MAXLENGTH    MSDAIPP_MAX_URL_LENGTH

#define RESOURCE_ISHIDDEN                       L"RESOURCE_ISHIDDEN"
#define RESOURCE_ISHIDDEN_ALTNAME               L"DAV:ishidden"  
#define RESOURCE_ISHIDDEN_DBTYPE                DBTYPE_BOOL
#define RESOURCE_ISHIDDEN_MAXLENGTH             sizeof(VARIANT_BOOL)

#define RESOURCE_ISREADONLY                     L"RESOURCE_ISREADONLY"
#define RESOURCE_ISREADONLY_ALTNAME             L"DAV:isreadonly"
#define RESOURCE_ISREADONLY_DBTYPE              DBTYPE_BOOL
#define RESOURCE_ISREADONLY_MAXLENGTH           sizeof(VARIANT_BOOL)

#define RESOURCE_CONTENTTYPE                    L"RESOURCE_CONTENTTYPE"
#define RESOURCE_CONTENTTYPE_ALTNAME            L"DAV:getcontenttype"
#define RESOURCE_CONTENTTYPE_DBTYPE             DBTYPE_WSTR
#define RESOURCE_CONTENTTYPE_MAXLENGTH          MSDAIPP_MAX_URL_LENGTH

#define RESOURCE_CONTENTCLASS                   L"RESOURCE_CONTENTCLASS"
#define RESOURCE_CONTENTCLASS_ALTNAME           L"DAV:contentclass"
#define RESOURCE_CONTENTCLASS_DBTYPE            DBTYPE_WSTR
#define RESOURCE_CONTENTCLASS_MAXLENGTH         MSDAIPP_MAX_URL_LENGTH

#define RESOURCE_CONTENTLANGUAGE                L"RESOURCE_CONTENTLANGUAGE"
#define RESOURCE_CONTENTLANGUAGE_ALTNAME        L"DAV:getcontentlanguage"
#define RESOURCE_CONTENTLANGUAGE_DBTYPE         DBTYPE_WSTR
#define RESOURCE_CONTENTLANGUAGE_MAXLENGTH      MSDAIPP_MAX_URL_LENGTH

#define RESOURCE_CREATIONTIME                   L"RESOURCE_CREATIONTIME"
#define RESOURCE_CREATIONTIME_ALTNAME           L"DAV:creationdate" 
#define RESOURCE_CREATIONTIME_DBTYPE            DBTYPE_FILETIME
#define RESOURCE_CREATIONTIME_MAXLENGTH         sizeof(FILETIME)

#define RESOURCE_LASTACCESSTIME                 L"RESOURCE_LASTACCESSTIME"
#define RESOURCE_LASTACCESSTIME_ALTNAME         L"DAV:lastaccessed"
#define RESOURCE_LASTACCESSTIME_DBTYPE          DBTYPE_FILETIME
#define RESOURCE_LASTACCESSTIME_MAXLENGTH       sizeof(FILETIME)

#define RESOURCE_LASTWRITETIME                  L"RESOURCE_LASTWRITETIME" 
#define RESOURCE_LASTWRITETIME_ALTNAME          L"DAV:getlastmodified"
#define RESOURCE_LASTWRITETIME_DBTYPE           DBTYPE_FILETIME 
#define RESOURCE_LASTWRITETIME_MAXLENGTH        sizeof(FILETIME)

#define RESOURCE_STREAMSIZE                     L"RESOURCE_STREAMSIZE"
#define RESOURCE_STREAMSIZE_ALTNAME             L"DAV:getcontentlength"
#define RESOURCE_STREAMSIZE_DBTYPE              DBTYPE_UI8
#define RESOURCE_STREAMSIZE_MAXLENGTH           sizeof(DWORDLONG)

#define RESOURCE_ISCOLLECTION                   L"RESOURCE_ISCOLLECTION"
#define RESOURCE_ISCOLLECTION_ALTNAME           L"DAV:iscollection"
#define RESOURCE_ISCOLLECTION_DBTYPE            DBTYPE_BOOL
#define RESOURCE_ISCOLLECTION_MAXLENGTH         sizeof(VARIANT_BOOL)

#define RESOURCE_ISSTRUCTUREDDOCUMENT           L"RESOURCE_ISSTRUCTUREDDOCUMENT"
#define RESOURCE_ISSTRUCTUREDDOCUMENT_ALTNAME   L"DAV:isstructureddocument"
#define RESOURCE_ISSTRUCTUREDDOCUMENT_DBTYPE    DBTYPE_BOOL
#define RESOURCE_ISSTRUCTUREDDOCUMENT_MAXLENGTH sizeof(VARIANT_BOOL)

#define RESOURCE_DEFAULTDOCUMENT                L"DEFAULT_DOCUMENT"
#define RESOURCE_DEFAULTDOCUMENT_ALTNAME        L"DAV:defaultdocument"
#define RESOURCE_DEFAULTDOCUMENT_DBTYPE         DBTYPE_WSTR
#define RESOURCE_DEFAULTDOCUMENT_MAXLENGTH      MSDAIPP_MAX_URL_LENGTH

#define RESOURCE_DISPLAYNAME                    L"RESOURCE_DISPLAYNAME"
#define RESOURCE_DISPLAYNAME_ALTNAME            L"DAV:displayname"
#define RESOURCE_DISPLAYNAME_DBTYPE             DBTYPE_WSTR
#define RESOURCE_DISPLAYNAME_MAXLENGTH          MSDAIPP_MAX_URL_LENGTH

#define RESOURCE_ISROOT                         L"RESOURCE_ISROOT"
#define RESOURCE_ISROOT_ALTNAME                 L"DAV:isroot"
#define RESOURCE_ISROOT_DBTYPE                  DBTYPE_BOOL 
#define RESOURCE_ISROOT_MAXLENGTH               sizeof(VARIANT_BOOL)

#define RESOURCE_ISMARKEDFOROFFLINE             L"RESOURCE_ISMARKEDFOROFFLINE"
#define RESOURCE_ISMARKEDFOROFFLINE_ALTNAME     L"MSDAIPP:ismarkedforoffline"
#define RESOURCE_ISMARKEDFOROFFLINE_DBTYPE      DBTYPE_BOOL
#define RESOURCE_ISMARKEDFOROFFLINE_MAXLENGTH   sizeof(VARIANT_BOOL)  
                 
#define RESOURCE_METATAGS                       L"RESOURCE_METATAGS"
#define RESOURCE_METATAGS_ALTNAME               L"MSDAIPP:metatags"
#define RESOURCE_METATAGS_DBTYPE				DBTYPE_WSTR
#define RESOURCE_METATAGS_MAXLENGTH             MSDAIPP_MAX_URL_LENGTH

#define RESOURCE_LISTBASETYPE				    L"RESOURCE_LISTBASETYPE"
#define RESOURCE_LISTBASETYPE_ALTNAME		    L"MSDAIPP:LISTBASETYPE"
#define RESOURCE_LISTBASETYPE_DBTYPE            DBTYPE_UI4															
#define RESOURCE_LISTBASETYPE_MAXLENGTH         sizeof(DWORD)

#define DBGUID_RESOURCE_ISMARKEDFOROFFLINE      {0x3c5d1c61,0x111e,0x11d2,{0x9c,0xda,0x00,0x00,0xf8,0x75,0xac,0x61}}
#define DBGUID_RESOURCE_METATAGS				{0xb95d3f73,0xf1d8,0x408f,{0xb2,0x74,0x7f,0xb3,0xa3,0x46,0x5b,0x3d}} 
#define DBGUID_RESOURCE_LISTBASETYPE			{0xcbe9a74f,0xeb2c,0x4635,{0xb6,0x6f,0x30,0x3e,0x5c,0x11,0xf2,0x43}}
#ifdef DBINITCONSTANTS
extern const DBID DBROWCOL_ISMARKEDFOROFFLINE = { DBGUID_RESOURCE_ISMARKEDFOROFFLINE, DBKIND_GUID, 0};
extern const DBID DBROWCOL_METATAGS           = { DBGUID_RESOURCE_METATAGS,           DBKIND_GUID, 0};
extern const DBID DBROWCOL_LISTBASETYPE       = { DBGUID_RESOURCE_LISTBASETYPE,		  DBKIND_GUID, 0};
#else
extern const DBID DBROWCOL_ISMARKEDFOROFFLINE;
extern const DBID DBROWCOL_METATAGS;
extern const DBID DBROWCOL_LISTBASETYPE;
#endif

///////////////////////////////////////////////////////////////////////////////////
// MSDAIPP ISynchronizeRow  -- For synchronization of cached row to server during
//  offline operations. Not used unless dealing with offline store.
//
#ifndef __ISynchronizeRow_INTERFACE_DEFINED__
#define __ISynchronizeRow_INTERFACE_DEFINED__

typedef DWORD MSDAIPP_SYNC_FLAGS;

enum MSDAIPP_SYNCFLAGSENUM
{
	MSDAIPP_SYNC_NONE	= 0,
	MSDAIPP_SYNC_ABANDON_SERVER	= 0x1,
	MSDAIPP_SYNC_ABANDON_LOCAL	= 0x2,
	MSDAIPP_SYNC_MERGE	= 0x4
};

#ifdef DBINITCONSTANTS
	extern const IID IID_ISynchronizeRow = {0x70546361, 0x1177, 0x11d2, {0x9C, 0xDB, 0x00, 0x00, 0xF8, 0x75, 0xAC, 0x61}};
#else
	extern const IID IID_ISynchronizeRow;
#endif

#if defined(__cplusplus) && !defined(CINTERFACE)
    
	interface ISynchronizeRow : public IUnknown
	{
		virtual HRESULT STDMETHODCALLTYPE Synchronize(MSDAIPP_SYNC_FLAGS dwFlags) = 0;
	};
 
#else /* C style interface */

    typedef struct ISynchronizeRowVtbl
    {        
        HRESULT (STDMETHODCALLTYPE *QueryInterface)(ISynchronizeRow *pthis, REFIID riid, void **ppvObject);
        ULONG   (STDMETHODCALLTYPE *AddRef)(ISynchronizeRow *pthis);
        ULONG   (STDMETHODCALLTYPE *Release)(ISynchronizeRow *pthis);
        HRESULT (STDMETHODCALLTYPE *Synchronize)(ISynchronizeRow *pthis, MSDAIPP_SYNC_FLAGS dwFlags);
    } ISynchronizeRowVtbl;

    interface ISynchronizeRow
    {
        CONST_VTBL struct ISynchronizeRowVtbl *lpVtbl;
    };

#endif
#endif // __ISynchronizeRow_INTERFACE_DEFINED__


///////////////////////////////////////////////////////////////////////////////////
// MSDAIPP IMsdaIppErrorInfo  -- For addtional (low level) error information.
//
#ifndef __IMsdaIppErrorInfo_INTERFACE_DEFINED__
#define __IMsdaIppErrorInfo_INTERFACE_DEFINED__

#ifdef DBINITCONSTANTS
	extern const IID IID_IMsdaIppErrorInfo = {0x2FAA6DE2, 0x3BD5, 0x454d, {0xAE, 0x92, 0x5E, 0x14, 0x98, 0x81, 0x54, 0x60}};
	extern const GUID GUID_WEC_LOWLEVEL	   = {0x29ad74c3, 0x74de, 0x4c3f, 0x84, 0x25, 0x20, 0x8e, 0x72, 0x2b, 0x10, 0x16};
	extern const GUID GUID_WEC_USERERROR   = {0x148cb105, 0x79b3, 0x4d46, 0xb1, 0xa0, 0x5f, 0x9f, 0xfa, 0x7d, 0x47, 0xfc};
	extern const GUID GUID_WININET		   = {0xf277dac4, 0x33bc, 0x42d6, 0xa4, 0x98, 0x94, 0x41, 0x48, 0xf1, 0x53, 0x19};
	extern const GUID GUID_HTTP			   = {0x4ddd6629, 0x01cc, 0x4a32, 0xb0, 0x9d, 0x9b, 0xbb, 0xdf, 0x30, 0x49, 0xd1};
	extern const GUID GUID_TAHOE		   = {0xdaf506a5, 0x99e6, 0x4371, 0x9d, 0x4d, 0xf2, 0x6d, 0xcd, 0xa9, 0xf4, 0x27};
#else
	extern const IID IID_IMsdaIppErrorInfo;
	extern const GUID GUID_WEC_LOWLEVEL;
	extern const GUID GUID_WEC_USERERROR;
	extern const GUID GUID_WININET;
	extern const GUID GUID_HTTP;
	extern const GUID GUID_TAHOE;
#endif

#if defined(__cplusplus) && !defined(CINTERFACE)
    
	interface IMsdaIppErrorInfo : public IUnknown
	{
        virtual HRESULT STDMETHODCALLTYPE GetMsdaIppErrorInfo(HRESULT *phResult, DWORD *pdwMinor, GUID *pguidErrorType) = 0;
        virtual HRESULT STDMETHODCALLTYPE GetDescription(BSTR *pbstrDescription) = 0;
	};
 
#else /* C style interface */

    typedef struct IMsdaIppErrorInfoVtbl
    {        
        HRESULT (STDMETHODCALLTYPE *QueryInterface)(IMsdaIppErrorInfo *pthis, REFIID riid, void **ppvObject);
        ULONG   (STDMETHODCALLTYPE *AddRef)(IMsdaIppErrorInfo *pthis);
        ULONG   (STDMETHODCALLTYPE *Release)(IMsdaIppErrorInfo *pthis);
        HRESULT (STDMETHODCALLTYPE *GetMsdaIppErrorInfo)(IMsdaIppErrorInfo *pthis, HRESULT *phResult, DWORD *pdwMinor, GUID *pguidErrorType);
        HRESULT (STDMETHODCALLTYPE *GetDescription)(IMsdaIppErrorInfo *pthis, BSTR *pbstrDescription);

    } IMsdaIppErrorInfoVtbl;

    interface IMsdaIppErrorInfo
    {
        CONST_VTBL struct IMsdaIppErrorInfoVtbl *lpVtbl;
    };

#endif
#endif //__IMsdaIppErrorInfo_INTERFACE_DEFINED__


#ifdef __cplusplus
} //extern "C"
#endif

#endif //__MSDAIPP_V2_H

